﻿using BLLTarasca;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using Tarasca.Models;

namespace Tarasca.Controllers
{
    [Authorize]
    public class MovimientosController : BaseController
    {
        public ActionResult Index(int idCuenta, int mes, int ano)
        {
            MovimientosModel model = new MovimientosModel();

            decimal saldo = 0;
            decimal? ingresosPeriodo = 0;
            decimal? gastosPeriodo = 0;
            BLLMovimiento bllMovimiento = new BLLMovimiento();

            if(new BLLCuenta().Pertenece(User.Identity.Name, idCuenta))
            {
                model.Movimientos = bllMovimiento.TraerMovimientos(idCuenta, mes, ano, out ingresosPeriodo, out gastosPeriodo, out saldo);
                model.SaldoPeriodo = saldo;
                model.IngresosPeriodo = (ingresosPeriodo == null) ? 0 : ingresosPeriodo.Value;
                model.GastosPeriodo = (gastosPeriodo == null) ? 0 : gastosPeriodo.Value;

                decimal totalIngresado = 0;
                decimal totalGastado = 0;
                decimal saldoTotal = 0;
                bllMovimiento.CalcularTotales(idCuenta, out totalIngresado, out totalGastado, out saldoTotal);
                model.IngresosTotales = totalIngresado;
                model.GastosTotales = totalGastado;
                model.SaldoTotal = saldoTotal;
            }

            return PartialView("_GrillaMovimientos", model);
        }

        public ActionResult Nuevo(int idCuenta)
        {
            EditarMovimientoModel model = new EditarMovimientoModel();

            if(new BLLCuenta().Pertenece(User.Identity.Name, idCuenta))
            {
                model.Categorias = new BLLCategoria().TraerCategorias(idCuenta).OrderBy(c => c.Nombre).ToList();
                model.MediosDePago = OrdenarMediosDePago(new BLLMedioDePago().TraerMedios().OrderBy(m => m.Nombre).ToList());

                model.IdMovimiento = 0;
                model.Descripcion = "";
                model.EsIngreso = false;
                model.Fecha = DateTime.Now.ToShortDateString();
                model.IdCategoria = model.Categorias.FirstOrDefault().IdCategoria;
                model.IdMedioDePago = model.MediosDePago.FirstOrDefault().IdMedioDePago;
                model.Monto = null;
                model.IdCuenta = idCuenta;
            }

            return PartialView("_EditarMovimiento", model);
        }

        public void Guardar(EditarMovimientoModel model)
        {
            BLLMovimiento bllMovimiento = new BLLMovimiento();
            BLLCategoria bllCategoria = new BLLCategoria(bllMovimiento.Contexto);
            BLLMedioDePago bllMedioDePago = new BLLMedioDePago(bllMovimiento.Contexto);
            BLLCuenta bllCuenta = new BLLCuenta(bllMovimiento.Contexto);

            TA_Movimiento movimiento = null;

            if (model.IdMovimiento == 0)
            {
                if (!bllCategoria.Pertenece(User.Identity.Name, model.IdCategoria))
                    return;
                movimiento = new TA_Movimiento();
            }
            else
            {
                if (!bllMovimiento.Pertenece(User.Identity.Name, model.IdMovimiento))
                    return;
                movimiento = bllMovimiento.TraerMovimiento(model.IdMovimiento);
            }

            movimiento.Descripcion = model.Descripcion;
            movimiento.EsIngreso = model.EsIngreso;
            movimiento.Fecha = DateTime.Parse(model.Fecha);
            movimiento.TA_Categoria = bllCategoria.Traer(model.IdCategoria);
            movimiento.TA_MedioDePago = bllMedioDePago.TraerMedioDePago(model.IdMedioDePago);
            movimiento.Monto = model.Monto;

            if (model.IdMovimiento == 0)
                bllMovimiento.CargarNuevoMovimiento(movimiento);

            bllMovimiento.GuardarCambios();
        }

        public ActionResult Editar(int idMovimiento)
        {
            BLLMovimiento bllMovimiento = new BLLMovimiento();
            EditarMovimientoModel model = new EditarMovimientoModel();

            if (bllMovimiento.Pertenece(User.Identity.Name, idMovimiento))
            {
                TA_Movimiento movimiento = bllMovimiento.TraerMovimiento(idMovimiento);
                model.Categorias = new BLLCategoria().TraerCategorias(movimiento.TA_Categoria.IdCuenta.Value).OrderBy(c => c.Nombre).ToList();
                model.MediosDePago = new BLLMedioDePago().TraerMedios().OrderBy(m => m.Nombre).ToList();

                model.IdMovimiento = idMovimiento;
                model.Descripcion = movimiento.Descripcion;
                model.EsIngreso = movimiento.EsIngreso.Value;
                model.Fecha = movimiento.Fecha.Value.ToShortDateString();
                model.IdCategoria = movimiento.IdCategoria.Value;
                model.IdMedioDePago = movimiento.IdMedioDePago.Value;
                model.Monto = movimiento.Monto.Value;
                model.IdCuenta = movimiento.TA_Categoria.IdCuenta.Value;
            }

            return PartialView("_EditarMovimiento", model);
        }

        public void Eliminar(int idMovimiento)
        {
            BLLMovimiento bllMovimiento = new BLLMovimiento();

            if (!bllMovimiento.Pertenece(User.Identity.Name, idMovimiento))
                return;

            bllMovimiento.Eliminar(idMovimiento);
            bllMovimiento.GuardarCambios();
        }
    }
}
